#ifndef _RENZO_MUST_HAVE_
#define _RENZO_MUST_HAVE_

// C include
#include <memory.h>
#include <stdlib.h>
#include <malloc.h>
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <string.h>
#include <float.h>
#include <math.h>
#include <wchar.h>
#include <time.h>
#include <windows.h>	// TODO: include this only when on Windows platform

// STL library
#include <vector>
#include <map>
using namespace std;

// definition
//#define _RenzoExport __declspec(dllexport)
//#define _RenzoImport __declspec(dllimport)

// The following ifdef block is the standard way of creating macros which make exporting 
// from a DLL simpler. All files within this DLL are compiled with the RENZODERER_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see 
// RENZODERER_API functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
#ifdef RENZODERER_EXPORTS
#define RENZODERER_API __declspec(dllexport)
#else
#define RENZODERER_API __declspec(dllimport)
#endif

// class list
/*
#include "RenzoFloat2.h"
#include "RenzoFloat3.h"
#include "RenzoFloat4.h"
#include "RenzoMatrix4.h"
*/

namespace Renzo {
	class Float2;
	class Float3;
	class Float4;
	class Matrix4;

	class Object;

	class SceneNode;
	class SceneNodeCamera;
	class SceneNodeMesh;
	class SceneNodeLight;

	class Scene;
	class SceneIO;
	class SceneManager;

	class Exception;
	class Log;
	class Renzoderer;

	class View;

	class DynLib;
	class DynLibManager;

	class Plugin;
	class PluginManager;

	class RenderSystem;

	class Mesh;
	class MeshMd2;
	class BoundingBox;

	class Vertex;
	class Face;

	class VertexBuffer;

	class RenderBuffer;
	class RenderBufferNull;

	class Display;

	class Camera;
	class Light;

	class Timer;

	class Image;
	class ImageManager;

	class Texture;
	class TextureManager;

	class Resource;
	class ResourceManager;

	class Material;

	class PrimitiveGroup;
	class PolygonGroup;

	class Animator;
	class AnimatorKeyFrame;

	enum ObjectType {	
		DummyType,
		CameraType,
		TextureType,
		ImageType,
		GeometryType,
		MaterialType,
		MeshType,
		PolygonGroupType,
		NB_RESOURCE_TYPES
	};
}



// ask to use the namespace Renzo right away so the following definitions can make use of the classes
//using namespace Renzo; // only necessary for CPP file that is not in Renzo namespace. We will declare "using..." in that CPP file.

// define basic data type (float4, mat4)
#include "RenzoTypedef.h"

// constant 
#include "RenzoConst.h"
// common math library global functions
//#include "RenzoMath.h"

// common global util functions
#include "RenzoUtil.h"

// 
// Disable warnings
//
#ifdef WIN32
#pragma warning( disable : 4251 )
#endif
#endif